import axios, { type Method } from 'axios'
import { useUserStore } from '@/stores'
import { showToast } from 'vant'
import router from '@/router'

// 1. 创建一个新的axios实例
const baseURL = 'https://consult-api.itheima.net/'
const instance = axios.create({
    baseURL,
    timeout: 1000
})

// 2. 配置请求拦截器
instance.interceptors.request.use(config => {
    // 修改config，比如修改请求头
    // 获取token
    const store = useUserStore()
    if (store.user?.token && config.headers) {
      // 这里还就得是做下function确认，不然它的类型太多，有可能不是function，如果只是一个布尔值或者字符串，给它做函数的形式调用的话，ts不允许
       typeof config.headers.set === 'function' && 
         config.headers.set('Authorization', `Bearer ${store.user.token}`)
    }
    return config
}, err => Promise.reject(err))

// 3. 配置响应拦截器
instance.interceptors.response.use(res => {
  // 判断业务是否成功
  if (res.data.code !== 10000) {
    showToast(res.data.message || '网络异常')
    return Promise.reject(res.data)
  }
  // 业务成功返回数据
  return res.data
}, err => {
  if (err.response.status === 401) {
    // 删除用户信息
    const store = useUserStore()
    store.delUser()
    // 跳转到登录,带上接口失效所在页面的地址，登录完成后回跳使用
    router.push(`/login?returnUrl=${router.currentRoute.value.fullPath}`)
  }
  return Promise.reject(err)
})

// 4. 封装请求工具函数
type Data<T> = {
  code: string
  message: string,
  data: T
}

const request = <T>(url: string, method: Method = 'get', submitData?: object) => {
  return instance.request<T,Data<T>>({
    url,
    method,
    // 区分get和其他请求post
    // get 提交数据，选项params
    // 其他请求post 提交数据，选项：data
    [method.toLowerCase() === 'get' ? 'params' : 'data']: submitData
  })
}

export { baseURL, instance, request }